Implementace funkce Random?

Otázka od: Petr Brant

29. 10. 2002 12:46

Subject: Implementace funkce Random?
Ahoj, nevite nekdo, jak je implementovana funkce Random? Potrebuji generovat
reprodukovatelnou radu pseudonahodnych cisel a v helpu je
"Because the
implementation of the Random function may change between compiler versions,
we do not recommend using Random for encryption or other purposes that
require reproducible sequences of pseudo-random numbers".
Tak abych se
vyhnul pripadnym problemum.

Zdravim

RNDr. Petr Brant [brant@dcomm.cz]
D&COMM s.r.o.
Korunovační 6
Praha 7
tel. +420724007234

Odpovedá: Jakub Dusek

29. 10. 2002 14:37

No ten help nelze   Opravdu se to mezi verzemi (tusim 3 a 4) zmenilo
a nikdo nezarucuje ze se to nestane znovu. Na pseudonahodna cisla je
tedy zrejme potreba pouzit vlastni rutinu, jinak se to pri upgradu,
teoreticky i pri instalaci update packu, a rekompilaci rozhodi...

Jakub Dusek

-------------------------------------------
Homepage : http://dusek.webz.cz
Phone : +420604615795
Sms email : jakub.dusek@click.cz
ICQ: 86063232
Apps : Add/Remove Manager, Charmaper,
            Sms GateKeeper
-------------------------------------------

Tuesday, October 29, 2002, 11:28:29 AM, you wrote:

PB> Ahoj, nevite nekdo, jak je implementovana funkce Random? Potrebuji
generovat
PB> reprodukovatelnou radu pseudonahodnych cisel a v helpu je
"Because the
PB> implementation of the Random function may change between compiler versions,
PB> we do not recommend using Random for encryption or other purposes that
PB> require reproducible sequences of pseudo-random numbers".
Tak abych se
PB> vyhnul pripadnym problemum.

PB> Zdravim

PB> RNDr. Petr Brant [brant@dcomm.cz]
PB> D&COMM s.r.o.
PB> Korunovační 6
PB> Praha 7
PB> tel. +420724007234

Odpovedá: Petr Fejfar

29. 10. 2002 12:56

From: "Petr Brant" <brant@dcomm.cz>

> Ahoj, nevite nekdo, jak je implementovana funkce
> Random?

Podivej se do Source\Rtl\Sys\system.pas na funkci
_RandInt


HTH, pf


Odpovedá: Petr Brant

29. 10. 2002 15:09

Diky, podival jsem se, ale je to procedura, ktera nic nevraci. Krome toho je
to v assembleru, takze netusim, co to vlastne dela, abych si to prepsal.

Zdravim

RNDr. Petr Brant [brant@dcomm.cz]
D&COMM s.r.o.
Korunovační 6
Praha 7
tel. +420724007234

 Subject: Re: Implementace funkce Random?

> Ahoj, nevite nekdo, jak je implementovana funkce
> Random?

 Podivej se do Source\Rtl\Sys\system.pas na funkci
 _RandInt

Odpovedá: David Janko

29. 10. 2002 15:19

Ahoj,
v "davnych" dobach kdyz jsem jeste venoval cryptografii sem vytvarel
generatory pseudonahodnych cisel, ty zakladni funkce nejsou slozite - mohli
by vam pomoci.
Nize je kod testujici myslim algoritmus X^2 mod N (gcc linux, ale myslim ze
to prelozite vsude).
At se dari  

---
Best Regards,
                        David Janko
                        programmer & Linux system administrator
                        djanko@infoware.cz
                        +420 604 164 999

/* test vyrovnanosti hodnot pseudo-random generatoru */

#include <stdio.h>
#include <math.h>
#include <time.h>

#define ANO 1
#define NE 0

void main(void) {
  long int x, cykly, i, y, N;
  int tisk;
  double faktor, soucet=0;
  time_t start, end;

  printf("init:");
  scanf("%d", &x);
  printf("pocet cyklu:");
  scanf("%d", &cykly);
  printf("N:");
  scanf("%d", &N);
  printf("\nmezivypis ? (0||1):");
  scanf("%d", &tisk);

  start = clock();
  for(i=0; i< cykly; i++) {
    y=(long int) fmod((fmod((double) x, (double)N) * fmod((double) x,
(double) N)), (double) N);
    x=y;
    soucet+=y;
    if (tisk == ANO) printf("\n%d", y);
  }
  end = clock();
  faktor = ( soucet / (double) cykly) - (((double)N - 1) / 2);
  //printf("soucet:%lf\n", soucet);
  //printf("cykly:%d\n", cykly);

  printf("\n\nPrumerovy faktor:\t%lf\n", faktor);
  printf("\nCas vypoctu %d hodnot:\t%f [s]\n", cykly, (end-start) / (double)
CLOCKS_PER_SEC);
}

Ahoj, nevite nekdo, jak je implementovana funkce Random? Potrebuji generovat
reprodukovatelnou radu pseudonahodnych cisel a v helpu je
"Because the
implementation of the Random function may change between compiler versions,
we do not recommend using Random for encryption or other purposes that
require reproducible sequences of pseudo-random numbers".
Tak abych se
vyhnul pripadnym problemum.


Odpovedá: Petr Fejfar

29. 10. 2002 23:36

From: "Petr Brant" <brant@dcomm.cz>

> Diky, podival jsem se, ale je to procedura,
> ktera nic nevraci.

:-O A co myslis, ze znamena komentar v zahlavi

    <- EAX Result

Na osvetleni bych doporucoval precist si kapitolu Program Control v Object
Pascal Language Guide
popr. si najit v helpu topic
Program Control | Function Results.

***

> Krome toho je to v assembleru, takze netusim,
> co to vlastne dela, abych si to prepsal.

V podstate toto (necht Seed je staticka promenna
typu integer, inicializovana na nejakou pocatecni
hodnotu, standardne 0, Randomize do ni strci
v podstate cas):

  Seed := Seed*$08088405+1;
  Result := int64(aRange)*int64(Seed) div $100000000;

Takova transcripce ale fungovat nebude, protoze shitoidni prascal neumi
unsigned 64 bitove operace.

Takze nejjednodussi to bude vzit, jak to je:


function RandomInteger(aRange:integer): integer;
asm
        IMUL EDX,[Seed],08088405H
        INC EDX
        MOV [Seed],EDX
        MUL EAX,EDX
        MOV EAX,EDX
end;


HTH, pf